using System;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Dimok.Concurrency;
using Dimok.Config;
using Dimok.Web.UI;

namespace Dimok.User {

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	User page. </summary>
	///
	/// <remarks>	Dimon, 12/21/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class UserPage : Dimok.Web.UI.PageBase {
		protected HtmlGenericControl title;
		protected object _uox;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the uox v. </summary>
		///
		/// <value>	The uox v. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected virtual object _uox_v{get{return _uox == null ? _uox = new UserObject() : _uox;}}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the uox. </summary>
		///
		/// <value>	The uox. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public UserObject uox{get{ return (UserObject)_uox_v; }}
		protected string timeTag = "";

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the time tag. </summary>
		///
		/// <value>	The time tag. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		private string TimeTag{get{return timeTag != "" ? timeTag : (timeTag = Locker.TimeTag);}}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public UserPage(){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Process the request described by context. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <exception cref="ASPException">	Thrown when asp. </exception>
		///
		/// <param name="context">	The context. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public override void ProcessRequest(System.Web.HttpContext context) {
			try {
				base.ProcessRequest(context);
			} catch (Exception exc) { throw new Dimok.Exceptions.ASPException(exc); }
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Raises the load event. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="e">	Event information to send to registered event handlers. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected override void OnLoad(EventArgs e) {
			base.OnLoad (e);
			HtmlGenericControl title = FindControl("title") as HtmlGenericControl;
			if( title != null )title.InnerHtml = uox.ApplInfo.FullName()+"("+uox.ApplID0+") in ["+uox.ApplInfo.MenuPath()+"]";
			AppendUserInfo();
			if( !Locker.NoLock ){
				try{if( uox.IsManagedMenu() )timeTag = uox.LockApplicant();
				}catch(NoMenuIDException){}
			}
			AppendTimeTag();
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Adds a data grid to 'caption'. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="dataSource">	The data source. </param>
		/// <param name="caption">		The caption. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected void AddDataGrid(object dataSource,string caption){
			DataGrid dg = new DataGrid();Controls.AddAt(0,dg);dg.AutoGenerateColumns = true;
			dg.Caption = caption;
			dg.DataSource = dataSource;
			dg.DataBind();
		}

		#region Appends

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Appends the time tag. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected void AppendTimeTag() { AppendText(Dimok.Concurrency.ConcurrencyTag.AppendTimeTag(TimeTag)); }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Appends the user information. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected void AppendUserInfo(){
			AppendText
(@"
<SCRIPT>
var userName = '"+uox.UserName+@"';
var userDisplayName = '"+uox.DisplayName+@"';
var userGroupsList = '"+string.Join(",",uox.Groups)+@"';
</SCRIPT>
");
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Appends the local base. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected void AppendLocalBase(){AppendText("<SCRIPT>var localBase='"+Config.application.LocalWebDomain+"';</SCRIPT>");}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Appends a text. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="text">	The text. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected void AppendText(string text){
			Literal ltr = new Literal();
			ltr.Text = text;
			Controls.Add(ltr);
		}
		#endregion

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Builds the attributes. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="attributes">	The attributes. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static string BuildAttributes(System.Web.UI.AttributeCollection attributes){
			string attrs = "";
			foreach( string attr in attributes.Keys )
				attrs += " "+attr+"='"+attributes[attr].Replace("'","\\'")+"' ";
			return attrs;
		}

	}
}
